package 排序;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

/**
 * @author admin
 * @version 1.0.0
 * @ClassName 你可以获得的最大硬币数量.java
 * @Description TODO
 * @createTime 2020年11月18日 09:03:00
 * 有 3n 堆数目不一的硬币，你和你的朋友们打算按以下方式分硬币：
 *
 * 每一轮中，你将会选出 任意 3 堆硬币（不一定连续）。
 * Alice 将会取走硬币数量最多的那一堆。
 * 你将会取走硬币数量第二多的那一堆。
 * Bob 将会取走最后一堆。
 * 重复这个过程，直到没有更多硬币。
 * 给你一个整数数组 piles ，其中 piles[i] 是第 i 堆中硬币的数目。
 *
 * 返回你可以获得的最大硬币数目。
 *输入：piles = [2,4,1,2,7,8]
 * 输出：9
 * 解释：选出 (2, 7, 8) ，Alice 取走 8 枚硬币的那堆，你取走 7 枚硬币的那堆，Bob 取走最后一堆。
 * 选出 (1, 2, 4) , Alice 取走 4 枚硬币的那堆，你取走 2 枚硬币的那堆，Bob 取走最后一堆。
 * 你可以获得的最大硬币数目：7 + 2 = 9.
 * 考虑另外一种情况，如果选出的是 (1, 2, 8) 和 (2, 4, 7) ，你就只能得到 2 + 4 = 6 枚硬币，这不是最优解。
 *
 * 思路：逆序 每次取2个直到取不到
 * 逆序很慢 只有双百分之五
 * 正序很快 接近双百
 */
public class 你可以获得的最大硬币数量 {
    public static void main(String[] args) {
        Solution solution=new Solution();
        int i = solution.maxCoins(new int[]{2,4,5});
        System.out.println(i);
    }
    static class Solution {
        //逆序思考每次取两个
        public int maxCoins(int[] piles) {
            if(piles.length==0){
                return 0;
            }
            ArrayList<Integer> list=new ArrayList<>();
            for(int a:piles){
                list.add(a);
            }

            list.sort(Comparator.reverseOrder());
             int res=0,count=list.size()/3;
            if(list.size()%3==2){
                count++;
            }
            for(int i=1;i<piles.length;i+=2){
                if(count==0){
                    break;
                }
                res+=list.get(i);
                count--;
            }
            return res;
        }
    }
    //正序思考 先把最小的分配完  然后每次取最小的 这个count有没有区别不大
    class Solution2 {
        public int maxCoins(int[] piles) {
            if(piles.length==0){
                return 0;
            }
            Arrays.sort(piles);
            int res=0,count=piles.length/3;
            if(piles.length%3==2){
                count++;
            }
            for(int i=count;i<piles.length;i+=2){
                if(count==0){
                    break;
                }
                res+=piles[i];
                count--;
            }
            return res;
        }
    }
}
